/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package GUI;

import Interaction.ServerConnection;
import java.rmi.RemoteException;
import Flightadministration.*;
import Data.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 */
public class FlightManageDi extends JPanel {

    final Main td;
    private JPanel jp;
    public DefaultTableModel model;
    public JTable table;
    public Vector<Vector> rowData;
    public Vector<String> columnNames;
    public int currentFlightId;
    public int timeOfDepartureAsInt;
    public int timeOfArrivalAsInt;

    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
     *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();


    // Konstruktor
    public FlightManageDi(final Main td) throws java.rmi.RemoteException {

        this.td = td;
        showFlightManageDi();
    }


    // Methoden
    public void showFlightManageDi() throws RemoteException {

        jp = new JPanel();
        
        //GridBagLayout
        //**********************************************************************

        GridBagLayout gbl = new GridBagLayout();
        jp.setLayout(gbl);
        jp.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Label
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Übersicht aller Flüge am Dienstag</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 2;
        jp.add(headline, constraints);


        //JTable
        //**********************************************************************

        // Vector für Spaltenüberschrift mit Werten belegen
        columnNames = new Vector<String>();
        columnNames.add("ID");
        columnNames.add("Abflugtag");
        columnNames.add("Uhrzeit");
        columnNames.add("Ankunftstag");
        columnNames.add("Uhrzeit");
        columnNames.add("Abflughafen");
        columnNames.add("Zielflughafen");
        columnNames.add("Fluglinie");

        // Vector mit Daten für JTable belegen
        rowData = admin.getAllFlightsOnTuesdayForTable();

        model = new DefaultTableModel( rowData, columnNames );
        model.addTableModelListener(table);
        table = new JTable(model) {
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
        table.setModel(model);
        table.setAutoCreateRowSorter(true);
        table.getColumnModel().getColumn(0).setPreferredWidth(10);
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 2;
        table.setPreferredScrollableViewportSize(new Dimension(550,450));
        table.setVisible(true);
        jp.add( new JScrollPane(table), constraints);


        //Buttons
        //**********************************************************************

        JButton button_CreateFlight = new JButton("Anlegen");
        constraints.gridwidth = 1;
        constraints.gridx = 0;
        constraints.gridy = 2;
        jp.add(button_CreateFlight, constraints);


        JButton button_DeleteFlight = new JButton("Löschen");
        constraints.gridx = 1;
        constraints.gridy = 2;
        jp.add(button_DeleteFlight, constraints);


        //ActionListener
        //**********************************************************************

        button_CreateFlight.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                ((CardLayout) td.rightp.getLayout()).show(td.rightp, "FlightC");
            }
        });


        button_DeleteFlight.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                if (table.getSelectedRow()==-1) {
                    JOptionPane.showMessageDialog(null, "Bitte ein Element der Liste auswählen!");
                }
                else {
                    int iSelectedRow = table.getSelectedRow();

                    Object[] options = {"Ja","Nein"};

                    String txt = "<HTML>Flug <i><u>" + table.getModel().getValueAt(iSelectedRow, 0) + " von "
                                    + table.getModel().getValueAt(iSelectedRow, 5)
                                    + " nach " + table.getModel().getValueAt(iSelectedRow, 6)
                                    + "</i></u> wirklich löschen? <br>"
                                    + "Dabei werden auch alle damit in Verbindung stehenden <br>"
                                    + "Flugdurchführungen und Buchungen gelöscht</html>";
                    int n = JOptionPane.showOptionDialog(td, txt, "Flug löschen",
                    JOptionPane.YES_NO_CANCEL_OPTION,
                    JOptionPane.QUESTION_MESSAGE,
                    null,
                    options,
                    options[1]);

                        if (n == 0) {
                            try {
                                // Id des ausgewählten Fluges auslesen
                                Object currentFlightId = table.getModel().getValueAt(iSelectedRow, 0);
                                    int currentFlightIdAsInt = Integer.parseInt(currentFlightId.toString());
                                // Abflugwochentag des ausgewählten Fluges auslesen
                                Object currentDayOfDeparture = table.getModel().getValueAt(iSelectedRow, 1);
                                    String currentDayOfDepartureAsString = String.valueOf(currentDayOfDeparture);
                                // Abfluguhrzeit des ausgewählten Fluges auslesen
                                Object currentTimeOfDeparture = table.getModel().getValueAt(iSelectedRow, 2);
                                    String currentTimeOfDepartureAsString = String.valueOf(currentTimeOfDeparture);
                                // Ankunftswochentag des ausgewählten Fluges auslesen
                                Object currentDayOfArrival = table.getModel().getValueAt(iSelectedRow, 3);
                                    String currentDayOfArrivalAsString = String.valueOf(currentDayOfArrival);
                                // Ankunftsuhrzeit des ausgewählten Fluges auslesen
                                Object currentTimeOfArrival = table.getModel().getValueAt(iSelectedRow, 4);
                                    String currentTimeOfArrivalAsString = String.valueOf(currentTimeOfArrival);
                                // Internationale Id des Startflughafens des ausgewählten Fluges auslesen
                                Object currentAirportOfDeparture = table.getModel().getValueAt(iSelectedRow, 5);
                                    String currentAirportOfDepartureAsString = String.valueOf(currentAirportOfDeparture);
                                        int index1 = currentAirportOfDepartureAsString.indexOf("(") + 1;
                                        int index2 = currentAirportOfDepartureAsString.indexOf(")");
                                            String intIdOfDepartureAirport = currentAirportOfDepartureAsString.substring(index1, index2);
                                // Internationale Id des Zielflughafens des ausgewählten Fluges auslesen
                                Object currentAirportOfArrival = table.getModel().getValueAt(iSelectedRow, 6);
                                    String currentAirportOfArrivalAsString = String.valueOf(currentAirportOfArrival);
                                        int index3 = currentAirportOfArrivalAsString.indexOf("(") + 1;
                                        int index4 = currentAirportOfArrivalAsString.indexOf(")");
                                            String intIdOfArrivalAirport = currentAirportOfArrivalAsString.substring(index3, index4);
                                // Id der Airline des Fluges auslesen
                                Object currentAirline = table.getModel().getValueAt(iSelectedRow, 7);
                                    String currentAirlineAsString = String.valueOf(currentAirline);
                                        int currentAirlineId = 0;
                                            Vector<Airline> allAirlines = admin.getAllAirlinesForComboBox();
                                                for(int i = 0; i<allAirlines.size(); i++) {
                                                    if(allAirlines.get(i).getAirName().equals(currentAirlineAsString)) {
                                                        currentAirlineId = allAirlines.get(i).getAirId();
                                                    }
                                                }

                                // Flugobjekt aus der Datenbank entfernen
                                admin.deleteFlight(currentFlightIdAsInt, currentTimeOfDepartureAsString, currentDayOfDepartureAsString,
                                                    currentTimeOfArrivalAsString, currentDayOfArrivalAsString,
                                                    intIdOfDepartureAirport, intIdOfArrivalAirport, currentAirlineId);

                                    // JTables aktualisieren
                                    td.updateFlight();

                                JOptionPane.showMessageDialog(null, "Flug gelöscht");

                            } catch (RemoteException ex) {
                                Logger.getLogger(AirportManage.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                }
            }
        });
    }


    public void updateTableData() throws RemoteException {

        // Vector mit Daten für JTable belegen
        rowData = admin.getAllFlightsOnTuesdayForTable();

        // Tabelleninhalt wird aktualisiert
        model.setDataVector(rowData, columnNames);

    }

    
    public JPanel getJp() {
        return jp;
    }
}